package com.xuwl.util;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


 /**
 * ┏┛ ┻━━━━━┛ ┻┓
 * ┃　　　━　　　┃
 * ┃　┳┛　  ┗┳　┃
 * ┃　　　　　　 ┃
 * ┃　　　┻　　　┃
 * ┗━┓　　　┏━━━┛
 * ┃　　　┃   神兽保佑,代码无BUG！
 * ┃　　　┗━━━━━━━━━┓
 * ┃　　　　　　　   ┣┓
 * ┃　　　　        ┏┛
 * ┗━┓ ┓ ┏━━━┳ ┓ ┏━┛
 * ┃ ┫ ┫   ┃ ┫ ┫
 * ┗━┻━┛   ┗━┻━┛
 * Created by xuwl on 2018/5/10.
 */

public class PDFChangeOneIMG {
	/**
	 * @Description pdf转成一张图片
	 * @author xuwl
	 * @created 2018年04月4日 下午1:54:13
	 * @param pdfFile
	 * @param outpath
	 */
	public void pdf2multiImage(String pdfFile, String outpath) {
		try {
			InputStream is = new FileInputStream(pdfFile);
			PDDocument pdf = PDDocument.load(is);
			int actSize = pdf.getNumberOfPages();
			List<BufferedImage> piclist = new ArrayList<BufferedImage>();
			for (int i = 0; i < actSize; i++) {
				BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, 130, ImageType.RGB);
				piclist.add(image);
			}
			yPic(piclist, outpath);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void pdf2multiImage(InputStream is, String outpath) {
		try {
			PDDocument pdf = PDDocument.load(is);
			int actSize = pdf.getNumberOfPages();
			List<BufferedImage> piclist = new ArrayList<BufferedImage>();
			for (int i = 0; i < actSize; i++) {
				BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, 130, ImageType.RGB);
				piclist.add(image);
			}
			yPic(piclist, outpath);
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 将宽度相同的图片，竖向追加在一起 ##注意：宽度必须相同
	 *
	 * @param piclist
	 *            文件流数组
	 * @param outPath
	 *            输出路径
	 */
	public void yPic(List<BufferedImage> piclist, String outPath) {// 纵向处理图片
		if (piclist == null || piclist.size() <= 0) {
			System.out.println("图片数组为空!");
			return;
		}
		try {
			int height = 0, // 总高度
					width = 0, // 总宽度
					_height = 0, // 临时的高度 , 或保存偏移高度
					__height = 0, // 临时的高度，主要保存每个高度
					picNum = piclist.size();// 图片的数量
			int[] heightArray = new int[picNum]; // 保存每个文件的高度
			BufferedImage buffer = null; // 保存图片流
			List<int[]> imgRGB = new ArrayList<int[]>(); // 保存所有的图片的RGB
			int[] _imgRGB; // 保存一张图片中的RGB数据
			for (int i = 0; i < picNum; i++) {
				buffer = piclist.get(i);
				heightArray[i] = _height = buffer.getHeight();// 图片高度
				if (i == 0) {
					width = buffer.getWidth();// 图片宽度
				}
				height += _height; // 获取总高度
				_imgRGB = new int[width * _height];// 从图片中读取RGB
				_imgRGB = buffer.getRGB(0, 0, width, _height, _imgRGB, 0, width);
				imgRGB.add(_imgRGB);
			}
			_height = 0; // 设置偏移高度为0
			// 生成新图片
			BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			for (int i = 0; i < picNum; i++) {
				__height = heightArray[i];
				if (i != 0)
					_height += __height; // 计算偏移高度
				imageResult.setRGB(0, _height, width, __height, imgRGB.get(i), 0, width); // 写入流中
			}
			imageResult = cutImage(imageResult, false, 5);
			File outFile = new File(outPath);
			ImageIO.write(imageResult, "jpg", outFile);// 写图片
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 切图，将图片的周边多出的白色区域过滤生成新的图片
	 * 
	 * @param imageResult
	 *            原始图片像素数据
	 * @param exactFlag
	 *            是否精确匹配
	 * @param border
	 *            保留白色边框的长度
	 * @return 返回切割后的图片数据
	 */
	private BufferedImage cutImage(BufferedImage imageResult, boolean exactFlag, int border) {
		int totalHeight = imageResult.getHeight();
		int totalWidth = imageResult.getWidth();
		int pixel, r, g, b;
		int startX = 0, startY = 0, endX = totalWidth, endY = totalHeight;
		boolean breakFlag = false;
		// 计算左上角第一个非白的坐标
		for (int line = 0; line < totalHeight; line++) {
			for (int col = 0; col < totalWidth; col++) {
				pixel = imageResult.getRGB(col, line);
				r = (pixel >> 16) & 0xff;
				g = (pixel >> 8) & 0xff;
				b = pixel & 0xff;
				if (r >= 0xfe && g >= 0xfe && b >= 0xfe) {
					continue;
				} else {
					startX = col;
					startY = line;
					breakFlag = true;
					break;
				}
			}
			if (breakFlag) {

				break;
			}
		}
		breakFlag = false; // 重置跳出标识
		// 计算右下角的坐标
		for (int line = totalHeight - 1; line >= 0; line--) {
			for (int col = totalWidth - 1; col >= 0; col--) {
				pixel = imageResult.getRGB(col, line);
				r = (pixel >> 16) & 0xff;
				g = (pixel >> 8) & 0xff;
				b = pixel & 0xff;
				if (r >= 0xfe && g >= 0xfe && b >= 0xfe) {
					continue;
				} else {
					endX = col;
					endY = line;
					breakFlag = true;
					break;
				}
			}
			if (breakFlag) {
				break;
			}
		}
		return imageResult.getSubimage(startX - border, startY - border, endX - startX + border * 2,
				endY - startY + border * 2);
	}

	// public static void main(String[] args) {
	// pdf2multiImage("D:\\application.pdf", "D:\\application2.jpg");
	// }
}
